/*
 * @Description: 
 * @Version: 1.0
 * @Autor: ziwei
 * @Date: 2021-05-27 14:53:27
 * @LastEditors: ziwei
 * @LastEditTime: 2021-07-07 16:58:19
 */
import { isObject, mergeOptions } from "../src/utils";

export function initGlobalAPI(Vue){
    Vue.options = {};//全局属性 在每个转眼间初始化的时候 将这些属性放到每个组件上
    Vue.mixin = function(options){
        mergeOptions(this.options,options)
        return this
    }
    
    //等会通过Vue.extend方法可以产生一个子类，new子类的时候会执行初始化流程（组件初始化）
    Vue.extend = function (opt) {//会产生一个子类
      const Super = this;//this = Vue
      const Sub = function (options) {//创造一个组件 其实就是new这个组件的类（组件的初始化）
        this._init(options)
      }
      //Object.create Object.setPrototypeOf()
      //Sub.prototype.__proto__ = Super.prototype
      Sub.prototype = Object.create(Super.prototype);//继承原型方法
      Sub.prototype.constructor = Sub;//Object.create会产生一个新的实例作为子类的原型，此时constructor会指向错误
      //合并父类和子类的options （需要让子类可以拿到全局属性）
      Sub.options = mergeOptions(Super.options,opt);
      Sub.min = Vue.mixin;
      return Sub;
    }
    
    Vue.options.component = {};//存放全局组件的；
    //defnition可以传入对象或者函数
    Vue.component = function name(id,defnition){
      let name = defnition.name||id;//
      defnition.name = name;

      if(isObject(defnition)){
        defnition = Vue.extend(defnition);
      }
      Vue.options.components[defination.name] = defination;
    }

    
    Vue.filter = function name(params){

    }
    Vue.directive = function name(params){

    }
}

//主要就是
// Vue.extend = function () {//会产生一个子类
//     const Super = this;
//     const Sub = function (options) {//创造一个组件 其实就是new这个组件的类（组件的初始化）
//         this._init(options);
//     }
//     Sub.prototype = Object.create(Super.prototype);
// }

// Vue.options.components = {};
// Vue.component = function (id, definition) {//definition 可以传入对象或者函数
//     definition.name = definition.name ||id;
//     if (isObject(definition)){
//         definition = Vue.extend(definition);
//     }
//     Vue.options.components[definition.name] = definition;
// }